package cn.edu.swu.miniwebsvr.core;

import cn.edu.swu.miniwebsvr.handler.DefaultHandler;
import cn.edu.swu.miniwebsvr.handler.EchoHandler;
import cn.edu.swu.miniwebsvr.handler.TimeHandler;
import java.util.HashMap;
import java.util.Map;

public class Config {
    private final int port = 8080;
    private final String webRoot = "webroot";
    private final Map<String, Handler> handlerMap = new HashMap<>();

    private Config() {
        handlerMap.put("/", new DefaultHandler());
        handlerMap.put("/time", new TimeHandler());
        handlerMap.put("/echo", new EchoHandler());
    }

    public static Config getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final Config INSTANCE = new Config();
    }

    public int getPort() {
        return port;
    }

    public String getWebRoot() {
        return webRoot;
    }

    public Handler getHandler(String url) {

        // TODO: [222024321072050/邓琳馨] 实现 URL 精确匹配或基础路径匹配逻辑
        // 添加空值检查
        // 1. 首先尝试精确匹配
        if (handlerMap.containsKey(url)) {
            return handlerMap.get(url);
        }

        // 2. 如果精确匹配失败，尝试基础路径匹配
        // 例如：/time/abc -> /time, /echo/123 -> /echo
        String basePath = extractBasePath(url);
        if (basePath != null && handlerMap.containsKey(basePath)) {
            return handlerMap.get(basePath);
        }

        // 3. 如果都不匹配，返回默认处理器
        return handlerMap.get("/");
    }

    /**
     * 从URL中提取基础路径
     * 例如：
     * /time/abc -> /time
     * /echo/test/123 -> /echo
     * /api/v1/user -> /api
     */
    private String extractBasePath(String url) {
        if (url == null || url.isEmpty() || url.equals("/")) {
            return "/";
        }

        // 移除查询参数
        String path = url.split("\\?")[0];

        // 按"/"分割路径
        String[] segments = path.split("/");

        // 如果只有一段（如 "/time"），直接返回
        if (segments.length <= 2) {
            return path;
        }

        // 返回前两段组成的基础路径（如 "/time"）
        return "/" + segments[1];
    }

    /**
     * 添加自定义处理器（可选，用于扩展）
     */
    public void addHandler(String path, Handler handler) {
        if (path != null && handler != null) {
            handlerMap.put(path, handler);
        }
    }

    /**
     * 获取所有已注册的处理器路径（用于调试或管理）
     */
    public Map<String, String> getRegisteredHandlers() {
        Map<String, String> handlers = new HashMap<>();
        for (Map.Entry<String, Handler> entry : handlerMap.entrySet()) {
            handlers.put(entry.getKey(), entry.getValue().getClass().getSimpleName());
        }
        return handlers;
    }
}